package com.cskaoyan.javase.oop3._1interface._3example.operation.impl;

import com.cskaoyan.javase.oop3._1interface._3example.model.Goods;
import com.cskaoyan.javase.oop3._1interface._3example.model.GoodsData;
import com.cskaoyan.javase.oop3._1interface._3example.operation.IGoodsOperation;

/**
 * 具体实现商品的操作
 *
 * @since 16:45
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class IGoodsOperationImpl implements IGoodsOperation {

    private Goods[] goods = GoodsData.GOODS;

    /**
     * 返回商品对象数组中的真实商品对象,主要工作是排除null元素
     * @return com.cskaoyan.javase.oop3._1interface._3example.model.Goods[]
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/10 16:47
     */
    @Override
    public Goods[] getAllGoods() {
        // 排除null元素,实际上是删除null元素,依赖于数组拷贝来实现
        // 1.新建一个数组,先计数,找到不为null元素的个数,就是新数组的长度
        int count = 0;
        for (Goods g : goods) {
            if (g != null) {
                count++;
            }
        }
        Goods[] result = new Goods[count];
        int newIndex = 0;
        for (Goods g : goods) {
            if (g != null) {
                result[newIndex] = g;
                newIndex++;
            }
        }
        return result;
    }

    /**
     *  根据输入的商品对象
     *      首先检查商品对象的id,确保id唯一,id重复返回2
     *      然后找到数组中为null的位置,插入,插入成功返回0
     *      插入失败返回1
     * @param g 要插入的商品对象
     * @return int
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/10 17:12
     */
    @Override
    public int insertGoods(Goods g) {
        int idInput = g.getId();
        // 判断id唯一性
        for (Goods goods : getAllGoods()) {
            if (goods.getId() == idInput){
                // id重复
                return 2;
            }
        }
        // 代码运行到这里,id一定不重复
        for (int i = 0; i < goods.length; i++) {
            // 查找null的位置,进行插入
            if (goods[i] == null){
                goods[i] = g;
                return 0;
            }
        }
        // 代码运行到这里,说明数组已经满了,插入失败
        return 1;
    }

    /**
     *  删除指用null替代原先的对象,达到删除的效果
     *  如果根据id找到对象,替换成功,表示删除成功,返回true
     *  如果找不到对象,就删除失败,返回false
     * @param id 要删除的商品id
     * @return boolean
     * @author wuguidong@cskaoyan.onaliyun.com
     * @since 2022/03/10 17:23
     */
    @Override
    public boolean deleteGoods(int id) {
        for (int i = 0; i < goods.length; i++) {
            // 排除null元素,避免空指针异常
            if (goods[i] == null){
                continue;
            }
            if (goods[i].getId() == id){
                goods[i] = null;
                // 删除成功
                return true;
            }
        }
        // 没有该商品,删除失败
        return false;
    }
}
